# Author: Yu Bin
# Date: 2025/01/03 10:58:41
# E-mail: 853823259@qq.com
import re


def single():
    """
    匹配单个字符
    :return:
    """
    ret = re.match(".", "M")
    print(ret.group())
    ret = re.match("t.o", "too")
    print(ret.group())
    ret = re.match("t.o", "two")
    print(ret.group())
    print('-' * 100)
    ret = re.match("[hH]", "hello Python")
    print(ret.group())
    ret = re.match("[hH]", "Hello Python")
    print(ret.group())
    ret = re.match("[hH]ello Python", "Hello Python")
    print(ret.group())
    # 匹配 0 到 9 第一种写法
    ret = re.match("[0123456789]Hello Python", "7Hello Python")
    print(ret.group())
    # 匹配 0 到 9 第二种写法
    ret = re.match("[0-9]Hello Python", "7Hello Python")
    print(ret.group())
    ret = re.match("[0-35-9]Hello Python", "7Hello Python")
    print(ret.group())


def more_alp():
    """
    匹配多个字符
    :return:
    """
    ret = re.match("[A-Z][a-z]*", "M")
    print(ret.group())
    ret = re.match("[A-Z][a-z]*", "MnnM")
    print(ret.group())
    ret = re.match("[A-Z][a-z]*", "Aabcdef")
    print(ret.group())
    names = ['name1', '_name', '2_name', '__name__']
    for name in names:
        ret = re.match(r'[a-zA-Z_]+\w*', name)
        if ret:
            print(f'{name}是正确的')
        else:
            print(f'{name}不符合规范')
    print('-' * 100)
    # ?
    ret = re.match("[1-9]?[0-9]", "7")
    print(ret.group())
    ret = re.match(r"[1-9]?\d", "33")
    print(ret.group())
    ret = re.match(r"[1-9]?\d", "09")
    print(ret.group())
    print('-' * 100)
    # {m},{m,n}
    ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678")
    print(ret.group())
    ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s34455ff66")
    print(ret.group())


def start_end():
    """
    匹配结尾
    :return:
    """
    # 找出163邮箱
    email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]
    for email in email_list:
        ret = re.match(r'\w{4,20}@163\.com$', email)
        if ret:
            print(f'{email}是正确的邮箱')
        else:
            print(f'{email}不是正确的邮箱')
    print('-' * 100)
    # 匹配0-99
    ret = re.match(r"[1-9]?\d$", "22")
    if ret:
        print('匹配成功')
    else:
        print('匹配失败')


def split_group():
    """
    匹配分组
    :return:
    """
    # 匹配0-100
    ret = re.match(r"[1-9]?\d$|100", "100")
    if ret:
        print(ret.group())
    else:
        print('不是0—100之间')
    print('-' * 100)
    # 匹配1-99
    ret = re.match(r"[1-9][0-9]|[1-9]", "99")
    if ret:
        print(ret.group())
    else:
        print('不是1—99之间')
    print('-' * 100)
    # ():匹配出 163、 126、 qq 邮箱
    ret = re.match(r"\w{4,20}@163\.com", "test@163.com")
    print(ret.group())  # test@163.com
    ret = re.match(r"\w{4,20}@(163|126|qq)\.com", "test@126.com")
    print(ret.group())  # test@126.com
    ret = re.match(r"\w{4,20}@(163|126|qq)\.com", "test@qq.com")
    print(ret.group())  # test@qq.com
    ret = re.match(r"\w{4,20}@(163|126|qq)\.com", "test@gmail.com")
    if ret:
        print(ret.group())
    else:
        print("不是 163、 126、 qq 邮箱")  # 不是 163、 126、 qq 邮箱
    print('-' * 100)
    ret = re.match(r"([^-]+)-(\d+)", "010-12345678")
    # ([^-]*) 代表没有遇到小横杠-就一直进行匹配， 一直匹配下去
    print(ret.group())
    print(ret.group(1))
    print(ret.group(2))
    print('-' * 100)

    # \:匹配出<html>hh</html>
    # 能够完成对正确的字符串的匹配
    ret = re.match(r"<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</html>")
    print(ret.group())
    # 通过引用分组中匹配到的数据即可， 但是要注意是元字符串， 即类似 r""这种格式
    ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")
    print('-' * 100)

    # /number
    print(ret.group())
    labels = ["<html><h1>www.cskaoyan.com</h1></html>", "<html><h1>www.cskaoyan.com</h2></html>"]
    for label in labels:
        ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
    if ret:
        print("%s 是符合要求的标签" % ret.group())
    else:
        print("%s 不符合要求" % label)
    print('-' * 100)

    # (?P<name>) (?P=name)
    # 需求： 匹配出<html><h1>www.cskaoyan.com</h1></html>
    ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>",
                   "<html><h1>www.cskaoyan.com</h1></html>")
    print(ret.group())
    ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>",
                   "<html><h1>www.cskaoyan.com</h2></html>")
    if ret:
        print("%s 是符合要求的标签" % ret.group())
    else:
        print("%s 不符合要求" % label)


def add(temp):
    strNum = temp.group()
    num = int(strNum) + 1
    return str(num)


def other_func():
    """
    search,findall,sub,split
    :return:
    """
    ret = re.search(r"\d+", "阅读次数为 9999")
    print(ret.group())
    print('-' * 100)
    ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
    print(ret)
    print('-' * 100)
    # sub 将匹配到的数据进行替换
    ret = re.sub(r"\d+", '998', "python = 997")
    print(ret)
    ret = re.sub(r"\d+", lambda x: str(int(x.group()) + 100), "python = 997")
    print(ret)
    ret = re.sub(r"\d+", add, "python = 997")
    print(ret)
    # sub 只替换前两个
    text = "apple apple apple apple"
    pattern = r"apple"
    replacement = "orange"
    new_text = re.sub(pattern, replacement, text, count=2)
    print(new_text)


def use_findall():
    s = 'hello world, now is 2020/7/20 18:48, 现在是2020年7月20日18时48分。'
    ret_s = re.sub(r'年|月', r'/', s)
    ret_s = re.sub(r'日', r' ', ret_s)
    ret_s = re.sub(r'时|分', r':', ret_s)
    print(ret_s)
    # findall 有问题
    com = re.compile(r'\d{4}/[01]?[0-9]/[1-3]?[0-9]\s(0[0-9]|1[0-9]|2[0-4])\:[0-5][0-9]')
    ret = com.findall(ret_s)
    print(ret)
    # 改为下面没问题， 在分组前面加?:
    com = re.compile(r'\d{4}/[01]?[0-9]/[1-3]?[0-9]\s(?:0[0-9]|1[0-9]|2[0-4])\:[0-5][0-9]')
    ret = com.findall(ret_s)
    print(ret)
    # search 没问题
    ret1 = re.search(r'\d{4}/[01]?[0-9]/[1-3]?[0-9]\s(0[0-9]|1[0-9]|2[0-4])\:[0-5][0-9]', ret_s)
    print(ret1.group())


def find_second_match(pattern, text):
    matches = re.finditer(pattern, text)
    try:
        next(matches)  # 跳过第一个匹配项
        second_match = next(matches)  # 获取第二个匹配项
        return second_match.group()
    except StopIteration:
        return None


def use_finditer():
    text = "abc123def456ghi789"
    pattern = r"\d+"
    second_match = find_second_match(pattern, text)
    print(second_match)


def use_sub():
    long_text = """
    <div>
<p>岗位职责： </p>
<p>完成推荐算法、 数据统计、 接口、 后台等服务器端相关工作</p>
<p><br></p>
<p>必备要求： </p>
<p>良好的自我驱动力和职业素养， 工作积极主动、 结果导向</p>
<p>&nbsp;<br></p>
<p>技术要求： </p>
<p>1、 一年以上 Python 开发经验， 掌握面向对象分析和设计， 了解设计模式</p>
<p>2、 掌握 HTTP 协议， 熟悉 MVC、 MVVM 等概念以及相关 WEB 开发框架</p>
<p>3、 掌握关系数据库开发设计， 掌握 SQL， 熟练使用 MySQL/PostgreSQL 中的一种<
br></p>
<p>4、 掌握 NoSQL、 MQ， 熟练使用对应技术解决方案</p>
<p>5、 熟悉 Javascript/CSS/HTML5， JQuery、 React、 Vue.js</p>
<p>&nbsp;<br></p>
<p>加分项： </p>
<p>大数据， 数理统计， 机器学习， sklearn， 高性能， 大并发。 </p>
</div>
    """
    ret = re.sub(r"<[^>]*>|&nbsp;|\n\s", "", long_text)
    print(ret)


def use_split():
    """
    切割字符串“info:xiaoZhang 33 shandong”
    :return:
    """
    ret = re.split(r":| ", "info:xiaoZhang 33 shandong")
    print(ret)


if __name__ == '__main__':
    # single()
    # more_alp()
    # start_end()
    # split_group()
    # other_func()
    # use_finditer()
    # use_findall()
    # use_sub()
    use_split()
